#include <iostream>
#include <pthread.h>
#include <memory>
#include <ctime>
#include <sys/types.h>
#include <unistd.h>


#include "RingQueue.hpp"
#include "task.hpp"


using namespace std;

char op[]={'+','-','*','/','%'};

void * consumerRoutine(void *args)
{
    RingQueue<Task> *rq=static_cast<RingQueue<Task>*>(args);
    while(true)
    {
        // int res=0;
        // rq->pop(&res);
        // cout<<res<<endl;
        // sleep(1);
        Task t;
        rq->pop(&t);
        t();
       cout<<t.formatRes()<<endl;
    }
}

void * productorRoutine(void *args)
{
    RingQueue<Task> *rq=static_cast<RingQueue<Task>*>(args);
    while(true)
    {
        // int data=rand()%20;
        // rq->push(data);
        Task *t=new Task(rand()%10,rand()%20+2,op[rand()%sizeof(op)+1]);
        rq->push(*t);
        cout<<t->formatArg()<<" ?"<<endl;
    }
}

int main()
{
    srand(time(nullptr)^getpid());
    RingQueue<Task> *rq=new RingQueue<Task>();
    
    //单生产单消费
    // pthread_t c,p;
    // pthread_create(&c,nullptr,consumerRoutine,rq);
    // pthread_create(&p,nullptr,productorRoutine,rq);
    // pthread_join(c,nullptr);
    // pthread_join(p,nullptr);


    //多生产多消费——更多的维护多生产和多消费的关系
    //多生产多消费的意义在于放前并发构建，拿后并发处理
    
    pthread_t c[3],p[2];
    for(int i=0;i<3;i++)
    {
        pthread_create(c+i,nullptr,consumerRoutine,rq);
    }
    for(int i=0;i<2;i++)
    {
        pthread_create(p+i,nullptr,productorRoutine,rq);
    }
    for(int i=0;i<3;i++)
    {
        pthread_join(*(c+i),nullptr);
    }
    for(int i=0;i<2;i++)
    {
        pthread_join(*(p+i),nullptr);
    }


    return 0;

}